//
// Created by denglibin on 19-10-29.
//

/**
 * epoll的水平触发与边沿触发
 * 水平触发： wait 接收到了10字节数据，如果本次只read了5字节 下次调用wait立即返回，再次read剩余的字节
 * 边沿触发：  wait 接收到了10字节数据，如果本次只read了5字节 下次调用wait不会立即返回，要等到有新的数据到达才返回，再次read会读取上次剩余的字节。
 * */

#include <sys/epoll.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
#include <errno.h>
#include<fcntl.h>
#define MAXLINE 10

static int main_(void){

    int efd;
    pid_t  pid;
    int pfd[2];//管道
    char * str = "abcdefghi";
    char buf[MAXLINE/2];
    pipe(pfd);

    pid = fork();
    if(pid == 0){
        close(pfd[0]); // 关闭写端
        while (1){
           write(pfd[1], str, strlen(str));
           sleep(5);
        }
    } else if(pid > 0){
        struct epoll_event ev, re_events[10];
        int res, len;
        close(pfd[1]);// 关闭读端
        efd = epoll_create(10);
        /*边沿触发，默认是水平触发*/
       ev.events = EPOLLIN | EPOLLET;
        // ev.events = EPOLLIN; //水平触发
        ev.data.fd = pfd[0];
        /*注册事件*/
        epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &ev);
        while (1){
            res = epoll_wait(efd, re_events, 10,-1);
            printf("%d->", res);
            if(re_events[0].data.fd == pfd[0]){
                len = read(pfd[0], buf, MAXLINE/2);
                write(STDOUT_FILENO, buf, len);
                write(STDOUT_FILENO, "\n", 1);
            }
        }
    } else {
        perror("fork:");
    }
    return 0;
}